#include "ListaOrdenada.h"
#include <stdio.h>


#ifndef __INDICE_INVERTIDO__
#define __INDICE_INVERTIDO__

#define __MAX_LENGTH_LEXICO__ 30

#define INDICE_FILE "indice.csv"
#define INDICE_TMP_FILE "indice_tmp.csv"

#include "TDADocumentos.h"
#include "TDALexicos.h"


/*
Este TDA deber� almacenar la relaci�n de aparici�n de los l�xicos (o palabras clave) y los
documentos donde estos l�xicos aparecen siempre que los l�xicos y los documentos sean
v�lidos. Los documentos de cada L�xico deber�n estar ordenados descendentemente por la
cantidad de consultas realizadas a dichos documentos.
La estructura de este TDA ser�:
*/

typedef struct
{
	char lexico[__MAX_LENGTH_LEXICO__];
	int cantidadConsultas;
	TListaSimpleOrdenada *listaDocumentos;
} ITEM_TDA_INDICE;


typedef struct TDAIndiceInvertido {
	TListaSimpleOrdenada *indice;
	int longitudConsulta;
	TDA_DOCUMENTOS *tdaDocumentos;
	TDA_LEXICOS *tdaLexicos;
}TDAIndiceInvertido;


/*
Esta primitiva configura el indice, carga los registros de los archivos en la estructura y valida
que los l�xicos y documentos del indice sean existentes en los diccionarios de l�xicos y
documentos. (Si pudo crear el �ndice retorna 0 sino retornara distintas excepciones cuyas
validaciones quedan a cargo del grupo).
*/

int iCrear(FILE * pArchivoIndiceCsv, FILE * pArchivoDocumentosCsv, FILE * pArchivoLexicosCsv, TDAIndiceInvertido * i, int longitudConsulta);


/*
Esta primitiva agrega una relaci�n documentol�xico
al indice, si la relaci�n no existe la agrega
al final del indice de documentos para dicho l�xico e inicializa en 0 la cantidad de consultas a
ese par documentol�xico.
(La m�trica que utilizaremos para ponderar al �ndice ser�
cantidadCosultas = cantidadConsultasDocumento * cantidadConsultasLexico )
Adem�s actualiza los diccionarios de l�xicos y de documentos.
*/
int iAgregar(TDAIndiceInvertido * i, char * lexico, int documento);


/*
Esta primitiva elimina una relaci�n documentol�xico
al indice y actualiza en 0 la cantidad de
consultasDocumento y L�xico. (Adem�s actualiza los diccionarios de l�xicos y de documentos)
*/
int iEliminar(TDAIndiceInvertido * i, char * lexico, int documento);


/*
Esta primitiva actualiza el par�metro de cantidad de documentos a mostrar en el resultado de la
consulta.
*/
int iActualizarLongitudConsulta(TDAIndiceInvertido * i, int longitudConsulta);

/*
Esta primitiva destruye la estructura y actualiza los archivos con la nueva informaci�n para
mantener persistencia y consistencia en los datos en futuros usos del indice y diccionarios.
(Si pudo destruir el indice retorna 0 sino retornara distintas excepciones cuyas validaciones
quedan a cargo del grupo).
*/
int iDestruir(FILE * pArchivoIndiceCsv, FILE * pArchivoDocumentosCsv, FILE * pArchivoLexicosCsv, TDAIndiceInvertido * i, int longitudConsulta);

/*
Esta primitiva obtendr� la lista de documentos que contengan dicho l�xico pasado por
par�metro retorn�ndolos en una lista con su id de documento, t�tulo y cantidad de veces que fue
consultado hist�ricamente.
Ademas actualizar� la cantidad de veces que fue consultado dicho l�xico, la cantidad de veces
que fue consultado dicho documento y la m�trica para rankear en el indice.
Los datos actualizados del �ndice deber�n persistir en un archivo (indiceInvertido.csv) con el
siguiente formato de registro:
l�xico1,cantidadConsultas,[idDocumento11,idDocumento12,...,idDocumento1N]
l�xico2,cantidadConsultas,[idDocumento21,idDocumento22,...,idDocumento2N]
...
l�xicoM,cantidadConsultas,[idDocumentoM1,idDocumentoM2,...,idDocumentoMN]
Siendo M el �ltimo l�xico agregado al indice. (Ordenados por su m�trica
cantidadConsultasLexico).
Siendo N el �ltimo documento relacionado en el �ndice Invertido para el l�xico definido entre 1..M.
(Los documentos deben estar ordenados seg�n su m�trica de cantidadConsultasDocumento).

La idea del orden es favorecer los l�xicos y documentos m�s accedidos en las futuras
b�squedas.
*/
int iConsultaRankeada(TDAIndiceInvertido *i, char* lexico, TListaSimpleOrdenada * documentos);

#endif __INDICE_INVERTIDO__
